package com.sz.virtualbank.service.account;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 账户服务接口
 * 
 * @author Claude
 */
public interface AccountService {
    
    /**
     * 查询账户余额
     *
     * @param userId 用户ID
     * @return 账户余额信息
     */
    Map<String, BigDecimal> getAccountBalance(Long userId);
    
    /**
     * 充值
     *
     * @param userId 用户ID
     * @param amount 充值金额
     * @param channel 充值渠道
     * @param uniqueToken 唯一标识（防重复提交）
     * @return 交易流水号
     */
    String recharge(Long userId, BigDecimal amount, String channel, String uniqueToken);
    
    /**
     * 提现
     *
     * @param userId 用户ID
     * @param amount 提现金额
     * @param bankCardId 银行卡ID
     * @param password 支付密码
     * @return 交易流水号
     */
    String withdraw(Long userId, BigDecimal amount, Long bankCardId, String password);
    
    /**
     * 转账
     *
     * @param userId 用户ID
     * @param targetAccount 目标账户
     * @param amount 转账金额
     * @param remark 备注
     * @param password 支付密码
     * @return 交易流水号
     */
    String transfer(Long userId, String targetAccount, BigDecimal amount, String remark, String password);
    
    /**
     * 冻结资金
     *
     * @param userId 用户ID
     * @param amount 冻结金额
     * @return 是否成功
     */
    boolean freezeAmount(Long userId, BigDecimal amount);
    
    /**
     * 解冻资金
     *
     * @param userId 用户ID
     * @param amount 解冻金额
     * @return 是否成功
     */
    boolean unfreezeAmount(Long userId, BigDecimal amount);
    
    /**
     * 支付（扣减余额）
     *
     * @param userId 用户ID
     * @param amount 支付金额
     * @param businessType 业务类型
     * @param businessId 业务ID
     * @return 交易流水号
     */
    String pay(Long userId, BigDecimal amount, String businessType, Long businessId);
    
    /**
     * 退款（增加余额）
     *
     * @param userId 用户ID
     * @param amount 退款金额
     * @param originalTradeNo 原交易流水号
     * @return 交易流水号
     */
    String refund(Long userId, BigDecimal amount, String originalTradeNo);
    
    /**
     * 验证支付密码
     *
     * @param userId 用户ID
     * @param password 支付密码
     * @return 是否正确
     */
    boolean verifyPayPassword(Long userId, String password);
}
